package com.zozo.guanli.util;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 
 * <p>
 * Description:分页对象 
 * </p>
 *
 * @author liulibo
 * @version 1.0

 * <p>
 * History: 
 *
 * Date                     Author         Version     Description
 * ---------------------------------------------------------------------------------
 * 2012-5-8 PM 1:34:46      liulibo        1.0         To create
 * </p>
 *
 * @since 
 * @see   
 * @param <T>
 */
public class Page<T> implements Serializable {

    private static final long serialVersionUID = -6179681674914852771L;

    private static int DEFAULT_PAGE_SIZE = 10;

    private int pageNo = 0; // 页码

    private int pageSize = DEFAULT_PAGE_SIZE; // 每页的记录数

    private int total = 0; // 总记录数

    private List<T> rows = new ArrayList<T>(0); // 当前页中存放的记录,类型一般为List

    private Map<String, String> order = new HashMap<String, String>(0);

    /**
     * 构造方法，只构造空页.
     */
    public Page() {

    }

    /**
     * 默认构造方法.
     */
    public Page(int pageNo, int pageSize, int total, List<T> rows) {
        this.pageNo = pageNo;
        this.pageSize = pageSize;
        this.total = total;
        this.rows = rows;
    }

    /**
     * 获取当前页码,页码从1开始.
     * 
     */
    public int getPageNo() {
        return pageNo;
    }

    /**
     * 设置当前页码.
     * 
     * @param pageNo
     */
    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }

    /**
     * 获取每页的记录数.
     * 
     */
    public int getPageSize() {
        return pageSize;
    }

    /**
     * 设置每页记录数.
     * 
     * @param pageSize
     */
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    /**
     * 获取总记录数.
     * 
     */
    public int getTotal() {
        return this.total;
    }

    /**
     * 设置总记录数
     * 
     * @param total
     */
    public void setTotal(int total) {
        this.total = total;
    }

    /**
     * 获取总页数.
     * 
     */
    public int getPageCount() {
        if (pageSize <= 0) {
            return 1;
        }
        if (total % pageSize == 0) {
            return total / pageSize;
        } else {
            return total / pageSize + 1;
        }
    }

    /**
     * 获取当前页中的记录.
     */
    public List<T> getRows() {
        return rows;
    }

    /**
     * 设置当前页记录
     * 
     * @param result
     */
    public void setRows(List<T> rows) {
        this.rows = rows;
    }

    /**
     * 获取任一页第一条数据在数据集的位置，每页条数使用默认值.
     * 
     * @see #getStartOfPage(int,int)
     */
    public int getFirstResultNo() {
        return getFirstResultNo(pageNo, pageSize);
    }

    /**
     * 获取任意一页最后一条数据在数据集的位置，每页条数使用默认值.
     * 
     * @return
     */
    public int getMaxResultNo() {
        return getMaxResultNo(pageNo, pageSize);
    }

    /**
     * 获取任意一页第一条数据在数据集的位置.
     * 
     * @param pageNo
     *            页码
     * @param pageSize
     *            每页的记录数
     * @return 该页第一条数据在数据集的位置.
     */
    public int getFirstResultNo(int pageNo, int pageSize) {
        return (pageNo - 1) * pageSize;
    }

    /**
     * 获取任意一页最后一条数据在数据集的位置
     * 
     * @param pageNo
     *            页码
     * @param pageSize
     *            每页的记录数
     * @return 该页最后一条数据在数据集的位置.
     */
    public int getMaxResultNo(int pageNo, int pageSize) {
        return (pageNo * pageSize >= total ? total : pageNo * pageSize);
    }

    /**
     * 转换页码和每页的记录数
     * 
     * @param pageNo
     *            页码
     * @param pageSize
     *            每页的记录数
     */
    public void wrapPage(String pageNo, String pageSize) {
        if (pageNo != null && !"".equals(pageNo)) {
            this.setPageNo(Integer.parseInt(pageNo));
        } else {
            this.setPageNo(1);
        }

        if (pageSize != null && !"".equals(pageSize)) {
            this.setPageSize(Integer.parseInt(pageSize));
        } else {
            this.setPageSize(10);
        }
    }

    /**
     * @return the order
     */
    public Map<String, String> getOrder() {
        return order;
    }

    /**
     * @param order the order to set
     */
    public void setOrder(Map<String, String> order) {
        this.order = order;
    }

    @Override
    public String toString() {
        return "Page [pageNo=" + pageNo + ", pageSize=" + pageSize + ", total=" + total + ", rows=" + rows + "]";
    }

}
